package com.tamd.lease.web.admin.custom.converter;

import com.tamd.lease.model.enums.BaseEnum;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;
import org.springframework.stereotype.Component;

@Component
public class StringToBaseEnumConverterFactory implements ConverterFactory<String, BaseEnum> {
    /**
     * 为枚举类型提供一个字符串到枚举实例的转换器
     *
     * @param <T> 扩展自BaseEnum的枚举类型
     * @param targetType 枚举类的类型
     * @return 一个将字符串转换为特定枚举实例的转换器
     */
    @Override
    public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> targetType) {
        return new Converter<String, T>() {
            /**
             * 将表示枚举值的字符串转换为枚举实例
             *
             * @param source 表示枚举值的字符串
             * @return 对应的枚举实例
             * @throws IllegalArgumentException 如果字符串表示的值不是枚举类的有效值
             */
            @Override
            public T convert(String source) {
                // 遍历枚举类的所有常量，寻找与源字符串值匹配的枚举实例
                for (T t : targetType.getEnumConstants()){
                                            // 比较枚举实例的code与源字符串值(要转成Integer类型)是否相等
                    if (t.getCode().equals(Integer.valueOf(source))){
                        return t;
                    }
                }
                // 如果没有找到匹配的枚举实例，抛出异常
                throw new IllegalArgumentException("非法的枚举值:"+source);
            }
        };
    }

}
